home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / util / xsize_1.0 / xsize.c < prev    next >
C/C++ Source or Header  |  1990-03-03  |  5KB  |  200 lines

  1. /*******************************************************************\
  2. *                                                                   *
  3. *                XSize - XWindows style window sizing               *
  4. *                                                                   *
  5. \*******************************************************************/
  6. /* Auto: make
  7. */
  8.  
  9. #define ARGVAL() (*++(*argv) || (--argc && *++argv))
  10. #define WriteStdOut(str) Write(StdOut, str, (LONG)strlen(str))
  11. #define isdigit(c) (c >= '0' && c <= '9')
  12.  
  13. struct XSizeRsrc *XSizeRsrc = NULL;
  14. struct InputEvent *handler();
  15.  
  16. /* input device */
  17. struct MsgPort *inputDevPort = NULL;
  18. struct Interrupt handlerStuff;
  19. struct IOStdReq *inputRequestBlock = NULL;
  20.  
  21. /* libraries */
  22. struct IntuitionBase *IntuitionBase = NULL;
  23. struct GfxBase       *GfxBase = NULL;
  24. struct LayersBase    *LayersBase = NULL;
  25.  
  26. /* detaching */
  27. ULONG _BackGroundIO = 0;
  28. ULONG _stack = 4096L;
  29. ULONG _priority = 4L;
  30. char *_procname = "XSize";
  31. #ifdef LATTICE
  32. extern BPTR _Backstdout;
  33. #endif LATTICE
  34.  
  35. LONG hextoint(str)
  36. REGISTER char *str;
  37. {
  38.     REGISTER long val = 0;
  39.     REGISTER char c;
  40.     while (c = *str) {
  41.         val <<= 4;
  42.         val |= (c & 15) + (isdigit(c) ? 0 : 9);
  43.         str++;
  44.     }
  45.     return(val);
  46. }
  47.  
  48. VOID CloseStuff()
  49. {
  50.     if (inputRequestBlock) {
  51.         if (inputRequestBlock->io_Device) {
  52.             inputRequestBlock->io_Command = IND_REMHANDLER;  /* Remove handler */
  53.             inputRequestBlock->io_Data    = (APTR)&handlerStuff;
  54.             DoIO(inputRequestBlock);
  55.             CloseDevice(inputRequestBlock);
  56.         }
  57.         DeleteExtIO(inputRequestBlock);
  58.     }
  59.     if (inputDevPort)       DeletePort(inputDevPort);
  60.     if (XSizeRsrc) {
  61.         RemResource(XSizeRsrc);
  62.         Kill(XSizeRsrc);
  63.     }
  64.     if (IntuitionBase)      CloseLibrary((struct Library *)IntuitionBase);
  65.     if (GfxBase)            CloseLibrary((struct Library *)GfxBase);
  66.     if (LayersBase)         CloseLibrary((struct Library *)LayersBase);
  67. }
  68.  
  69. WORD OpenStuff()
  70. {
  71.     inputRequestBlock = NULL;
  72.  
  73.     /* libraries */
  74.  
  75.     if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)))
  76.         return 0;
  77.     if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)))
  78.         return 0;
  79.     if (!(LayersBase = (struct LayersBase *)OpenLibrary("layers.library", 0L)))
  80.         return 0;
  81.  
  82.     /* input devive */
  83.  
  84.     if (!(inputDevPort = CreatePort(0L, 0L)))
  85.         return 0;
  86.     if (!(inputRequestBlock = (struct IOStdReq *)CreateExtIO(inputDevPort, (LONG)sizeof(struct IOStdReq))))
  87.         return 0;
  88.     if (OpenDevice("input.device", 0L, inputRequestBlock, 0L))
  89.         return 0;
  90.  
  91.     /* input handler */
  92.  
  93.     handlerStuff.is_Data = 0;
  94.     handlerStuff.is_Code = (VOID (*)())handler;
  95.     handlerStuff.is_Node.ln_Pri = 53;        /* Ahead of intuition, please */
  96.     handlerStuff.is_Node.ln_Name = "XSize Input Handler";
  97.  
  98.     inputRequestBlock->io_Command = IND_ADDHANDLER;
  99.     inputRequestBlock->io_Data    = (APTR)&handlerStuff;
  100.  
  101.     DoIO(inputRequestBlock);  /* Add me. */
  102.  
  103.     return 1;
  104. }
  105.  
  106. VOID main(argc, argv)
  107. int argc;
  108. char **argv;
  109. {
  110.     BPTR StdOut = (BPTR)Open("*", MODE_OLDFILE);
  111.     WORD create = 0;
  112.     WORD usage = 0;
  113.  
  114. #ifdef AZTEC_C
  115.     Enable_Abort = 0;
  116. #endif AZTEC_C
  117.  
  118.     if (!(XSizeRsrc = (struct XSizeRsrc *)OpenResource(XSIZERSRC))) {
  119.         create = 1;
  120.         XSizeRsrc = Create(XSizeRsrc);
  121.         XSizeRsrc->node.ln_Type = NT_RESOURCE;
  122.         XSizeRsrc->node.ln_Name = XSIZERSRC;
  123.         XSizeRsrc->Task = FindTask(NULL);
  124.         XSizeRsrc->qual = IEQUALIFIER_CONTROL;
  125.         AddResource(XSizeRsrc);
  126.     }
  127.  
  128.     if (!argc) {    /* WB Startup */
  129.         if (!create) {     /* Second time from WB -- Remove */
  130.             Signal(XSizeRsrc->Task, SIGBREAKF_CTRL_C);
  131.             goto exitpoint;
  132.         } else {
  133.             goto skipargs;
  134.         }
  135.     }
  136.  
  137.     if (create && StdOut) {
  138.         WriteStdOut("XSize 1.0 (c) 1990 Mikael Karlsson\n");
  139.     }
  140.  
  141.     for (argc--, argv++; argc > 0; argc--, argv++) {
  142.         if (**argv == '-') { /* Argument coming up */
  143.             switch(*++(*argv)) {
  144.                 case 'x': {
  145.                     if (ARGVAL()) {
  146.                         XSizeRsrc->qual = hextoint(*argv);
  147.                     } else {
  148.                         usage = 1;
  149.                     }
  150.                     break;
  151.                 }
  152.                 case 'Q': quit: {
  153.                     Close(StdOut);
  154.                     if (create) {
  155.                         goto close;
  156.                     } else {
  157.                         Signal(XSizeRsrc->Task, SIGBREAKF_CTRL_C);
  158.                         goto exitpoint;
  159.                     }
  160.                 }
  161.                 case '?': {
  162.                     usage = 1;
  163.                     break;
  164.                 }
  165.                 default: {
  166.                     if (StdOut) {
  167.                         WriteStdOut("Bad option: -");
  168.                         Write(StdOut, *argv, 1L);
  169.                         WriteStdOut(".\n");
  170.                     }
  171.                     usage = 1;
  172.                     break;
  173.                 }
  174.             }
  175.         } else {
  176.             usage = 1;
  177.         }
  178.     }
  179.  
  180.     if (usage && StdOut) {
  181.         WriteStdOut("Usage:\n");
  182.         WriteStdOut(" XSize -xXX -Q\n");
  183.     }
  184.  
  185. skipargs:
  186.     if (StdOut) {
  187.         Close(StdOut);
  188.     }
  189.  
  190.     if (create) {
  191.         if (OpenStuff()) {
  192.             Wait(SIGBREAKF_CTRL_C);
  193.         }
  194. close:
  195.         CloseStuff();  /* Guess what */
  196.     }
  197.  
  198. exitpoint: ;
  199. }
  200.